package Day_0223.Spring;

/**
 * @author zxc
 * @date 2023/02/23 21:20
 **/
public class BeanPostProcessor_Registration_Timing {
    public static void main(String[] args) {
        /**
         * 扩展阅读: BeanPostProcessor注册时机与执行顺序
         * ===》
         * 1.首先，要明确一个概念，在spring中一切皆bean
         * 所有的组件都会被作为一个bean装配到spring容器中;
         *
         * 2.Bean作为组件，装载到Spring容器中的详细过程
         * （1）首先，读取xml文件 && 解析xml文件，获取配置中的各个bean定义，将其存储到beanFactory中;
         *  同时，会加载BeanPostProcessor到BeanFactory中;
         * （2）其次，根据容器中的bean Definition去实例化Bean对象，同时将实例化后的Bean对象存储到 Spring容器中的Bean缓冲池中;
         * （3）若是其他应用程序去使用该Bean的话，则会直接去Bean缓冲池中，获取所需要的Bean
         *
         *
         * 3.BeanPostProcessor的注册时机
         * （1）Spring是先执行registerBeanPostProcessors()进行BeanPostProcessors的注册，
         * （2）然后再执行finishBeanFactoryInitialization创建我们的单例非懒加载的Bean。
         * ===》
         * 总结 ：
         * Spring，首先对于BeanPostProcessors进行注册 && 后续再去创建和注册 单例非懒加载的Bean;
         *
         * 4.执行顺序
         * 1）BeanPostProcessor有很多个，而且每个BeanPostProcessor都影响多个Bean，其执行顺序至关重要，必须能够控制其执行顺序才行。
         * 2）关于执行顺序这里需要引入两个排序相关的接口：PriorityOrdered、Ordered
         * （1）PriorityOrdered ：
         *  是一等公民，首先被执行，PriorityOrdered公民之间通过接口返回值排序
         * （2）Ordered ：
         *  是二等公民，然后执行，Ordered公民之间通过接口返回值排序
         * （3）为实现上述任何接口 ：
         *  是三等公民，最后执行
         *
         *  ===》
         *  总结 ：
         *  可以很清晰的看到Spring注册各种类型BeanPostProcessor的逻辑，根据实现不同排序接口进行分组。
         *  优先级高的先加入，优先级低的后加入。
         *
         */
    }
}
